package com.bolt.convention.data;

import com.bolt.common.utils.ExceptionUtil;
import com.bolt.convention.data.code.CommonCode;
import com.bolt.convention.data.code.ServiceCode;
import com.bolt.convention.data.code.SuccessCode;
import com.bolt.convention.exception.ServiceException;

import java.util.List;

/**
 * Created by Administrator on 2019/1/16.
 */
public class Results {

    /**
     *　成功
     * @return
     */
    public static  ResultMessage<Void> success() {
        return new DefaultResultMessage<Void>()
                .setCode(SuccessCode.SUCCESS.code())
                .setMessage(SuccessCode.SUCCESS.message());
    }

    public static  ResultMessage<Void> success(String message) {
        return new DefaultResultMessage<Void>()
                .setCode(SuccessCode.SUCCESS.code())
                .setMessage(message);
    }

    /**
     * 成功
     * @param data 并设置data参数
     * @param <T> data的泛型
     * @return ResultMessage<T>
     */
    public static <T> ResultMessage<T> success(T data) {
        return new DefaultResultMessage<T>()
                .setCode(SuccessCode.SUCCESS.code())
                .setMessage(SuccessCode.SUCCESS.message()).setData(data);
    }

    /**
     * 验证出错
     * @param <T>
     * @return
     */
    public static <T> ResultMessage<T> invalid() {
        return new DefaultResultMessage<T>()
                .setCode(CommonCode.INVALID_ARGS.code())
                .setMessage(CommonCode.INVALID_ARGS.message());
    }

    public static <T> ResultMessage<T> failure(ServiceCode serviceCode) {
        return new DefaultResultMessage<T>().setCode(serviceCode.code())
                .setMessage(serviceCode.message());
    }

    public static <T> ResultMessage<T> failure(ServiceException serviceException) {
        return new DefaultResultMessage<T>().setCode(serviceException.getCode())
                .setMessage(serviceException.getMessage());
    }

    public static <T> ResultMessage<T> invalid(String message) {
        return new DefaultResultMessage<T>().setCode(CommonCode.INVALID_ARGS.code()).setMessage(message);
    }

    public static <T> ResultMessage<T> invalid(String message, List<ResultMessage.ViolationItem> violationItems) {
        return new DefaultResultMessage<T>().setCode(CommonCode.INVALID_ARGS.code()).setMessage(message)
                .setViolationItems(violationItems);
    }

    public static <T> ResultMessage<T> invalid(List<ResultMessage.ViolationItem> violationItems) {
        return new DefaultResultMessage<T>().setCode(CommonCode.INVALID_ARGS.code())
                .setMessage(CommonCode.INVALID_ARGS.message())
                .setViolationItems(violationItems);
    }

    /**
     * 返回带异常信息的响应结果，当成系统错误（bug）来处理
     *
     * @param e 异常
     */
    public static <T> ResultMessage<T> error(ServiceException e) {
        return new DefaultResultMessage<T>()
                .setCode(e.getCode())
                .setMessage(e.getMessage())
                .setErrorClass(e.getClass().getName())
                .setErrorStack(ExceptionUtil.stacktraceToString(e));
    }


    /**
     * 返回带异常信息的响应结果，当成系统错误（bug）来处理
     *
     * @param throwable 异常
     */
    public static <T> ResultMessage<T> error(Throwable throwable) {
        return new DefaultResultMessage<T>()
                .setCode(CommonCode.UNKNOWN_ERROR.code())
                .setMessage(CommonCode.UNKNOWN_ERROR.message())
                .setErrorClass(throwable.getClass().getName())
                .setErrorStack(ExceptionUtil.stacktraceToString(throwable));
    }

    /**
     *
     * 返回带异常信息的响应结果，可以自己明确的系统错误
     *
     * @param errorCode 错误码
     * @param throwable 异常
     * @param <T> 对应data字段的数据类型
     * @return result 对象
     */
    public static <T> ResultMessage<T> error(ServiceCode errorCode, Throwable throwable) {
        return new DefaultResultMessage<T>()
                .setCode(errorCode.code())
                .setMessage(errorCode.message())
                .setErrorClass(throwable.getClass().getName())
                .setErrorStack(ExceptionUtil.stacktraceToString(throwable));
    }


    /**
     *
     * 返回带异常信息的响应结果，可以自己明确的系统错误
     *
     * @param code 错误编号
     * @param message 错误信息
     * @param errorClass 错误类名
     * @param <T> 对应data字段的数据类型
     * @return result 对象
     */
    public static <T> ResultMessage<T> error(String code, String message, String errorClass) {
        return new DefaultResultMessage<T>()
                .setCode(code)
                .setMessage(message)
                .setErrorClass(errorClass);
    }

    public static ResultMessage<Void> error(String code, String message) {
        return new DefaultResultMessage<Void>()
                .setCode(code)
                .setMessage(message);
    }


    /**
     * 构建参数验证失败的项目
     * @param field 字段名称
     * @param message 信息
     * @return 参数验证失败的项目
     */
    public static ResultMessage.ViolationItem buildViolationItem(String field, String message) {
        return new DefaultResultMessage.DefaultVioationItem(field, message);
    }



}
